﻿--[[
仅用于userdata索引访问函数，C#定义
参数：
  tbl  : 目标Lua表（数组形式）
  index: 索引值（支持正负索引）
  strict: [可选]严格模式，默认false，设为true时额外校验元素连续性
返回值：
  对应索引位置的元素
异常：
  类型错误或索引越界时抛出错误
--]]
function At_Lua(tbl, index)
    -- 参数校验阶段 
    -- 检查第一个参数是否为table
    if type(tbl) ~= "userdata" then
        error("bad argument #1 (expected table, got "..type(tbl)..")", 2)
    end
    
    -- 检查索引是否为整数
    if type(index) ~= "number" or math.floor(index) ~= index then
        error("index must be integer, got "..type(index), 2)
    end

    -- 长度计算策略 
    local len = tbl.Length
    
    -- 严格模式下验证表连续性


    -- 索引转换逻辑 
    local adjusted_index
    
    -- 处理正索引（userdata是 的0-based）
    if index >= 0 then
        adjusted_index = index 
    -- 处理负索引（从末尾倒数）
    else
        adjusted_index = len + index 
    end

    -- 边界检查与错误处理 
    -- 有效索引范围：1 ≤ index ≤ len
    if adjusted_index < 0 or adjusted_index >= len then
        local direction = index >=0 and "positive" or "negative"
        error(string.format("Index %d (%s) out of range [%d, %d]", 
                          index, direction, -len, len-1), 2)
    end

    -- 最终元素获取 
    return tbl[adjusted_index]
end